From c1488502c949923a41707f8ea302dcfe0b9eab36 Mon Sep 17 00:00:00 2001 From: Keir Fraser Date: Thu, 3 Dec 2009 13:52:02 +0000 Subject: [PATCH] grant-tables: do not fail attempts to GNTTABOP_set_version to the current version. ...even if there are active grants. This triggers when checkpoint a guest which essentially resumes without actually having gone through the suspend so the domain is already latched to v2 inside Xen. Also return the current actual version on success and failure. Not terribly useful with only 2 options but is more robust to future developments. Signed-off-by: Ian Campbell --- xen/common/grant_table.c | 21 ++++++++++++++++----- xen/include/public/grant_table.h | 2 +- 2 files changed, 17 insertions(+), 6 deletions(-) diff --git a/xen/common/grant_table.c b/xen/common/grant_table.c index 1deac08473..d046ec1139 100644 --- a/xen/common/grant_table.c +++ b/xen/common/grant_table.c @@ -1972,14 +1972,19 @@ gnttab_set_version(XEN_GUEST_HANDLE(gnttab_set_version_t uop)) struct domain *d = current->domain; struct grant_table *gt = d->grant_table; struct active_grant_entry *act; - long res = 0; + long res; int i; if (copy_from_guest(&op, uop, 1)) return -EFAULT; + res = -EINVAL; if (op.version != 1 && op.version != 2) - return -EINVAL; + goto out; + + res = 0; + if ( gt->gt_version == op.version ) + goto out; spin_lock(>->lock); /* Make sure that the grant table isn't currently in use when we @@ -1997,7 +2002,7 @@ gnttab_set_version(XEN_GUEST_HANDLE(gnttab_set_version_t uop)) gt->gt_version, op.version); res = -EBUSY; - goto out; + goto out_unlock; } } } @@ -2009,7 +2014,7 @@ gnttab_set_version(XEN_GUEST_HANDLE(gnttab_set_version_t uop)) { res = gnttab_populate_status_frames(d, gt); if ( res < 0) - goto out; + goto out_unlock; } if ( op.version < 2 && gt->gt_version == 2 ) @@ -2025,9 +2030,15 @@ gnttab_set_version(XEN_GUEST_HANDLE(gnttab_set_version_t uop)) gt->gt_version = op.version; -out: +out_unlock: spin_unlock(>->lock); +out: + op.version = gt->gt_version; + + if (copy_to_guest(uop, &op, 1)) + res = -EFAULT; + return res; } diff --git a/xen/include/public/grant_table.h b/xen/include/public/grant_table.h index abc0662608..84a7e7d25e 100644 --- a/xen/include/public/grant_table.h +++ b/xen/include/public/grant_table.h @@ -463,7 +463,7 @@ DEFINE_XEN_GUEST_HANDLE(gnttab_unmap_and_replace_t); */ #define GNTTABOP_set_version 8 struct gnttab_set_version { - /* IN parameters */ + /* IN/OUT parameters */ uint32_t version; }; typedef struct gnttab_set_version gnttab_set_version_t; -- 2.30.2